package cn.tedu.eb_film.service;

import cn.tedu.eb_film.pojo.dto.MovieAddNewDTO;
import cn.tedu.eb_film.pojo.dto.MovieExcelDTO;
import cn.tedu.eb_film.pojo.dto.MovieUpdateDTO;
import cn.tedu.eb_film.pojo.vo.MovieListVO;
import cn.tedu.eb_film.pojo.vo.MovieStandardVO;
import cn.tedu.eb_film.utils.JsonPage;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 电影表(movie)的实现接口
 *
 * @author diaojie
 * @since 2023/03/17 12:36:32
 */
@Transactional(rollbackFor = Exception.class)
public interface MovieService {

    /**
     * 类别“是否启用”的状态文本
     */
    String[] ENABLE_TEXT = {"禁用", "启用"};

    /**
     * 添加电影表数据
     * @param movieAddNewDTO 新增的电影表数据
     */
    void addNew(MovieAddNewDTO movieAddNewDTO);

    /**
     * 添加电影表数据文件
     * @param list 新增的电影表数据文件
     */
    void addExcelList(List<MovieExcelDTO> list);

    /**
     *根据id删除电影表
     * @param id 删除电影表的id
     */
    void deleteById(Long id);

    /**
     *根据ids批量删除电影表
     * @param ids 删除电影表的ids
     */
    void deleteByIds(Long[] ids);

    /**
     * 修改电影数据
     * @param id 需要修改的电影id
     * @param movieUpdateDTO 修改的电影数据
     */
    void updateInfoId(Long id, MovieUpdateDTO movieUpdateDTO);
    /**
     * 启用类别
     *
     * @param id 尝试启用的类别的id
     */
    void setEnable(Long id);

    /**
     * 禁用类别
     *
     * @param id 尝试禁用的类别的id
     */
    void setDisable(Long id);
    /**
     * 根据id查询电影数据
     * id 查询的id
     * @return 电视数据
     */
    MovieStandardVO getStandardById(Long id);

    /**
     * 即将上映的电影查询(排除掉状态为2)
     * @return 电影数据列表
     */
    List<MovieListVO> listReleaseDate();

    /**
     * 即将上映的电影查询(状态为1)
     * @return 电影数据列表
     */
    List<MovieListVO> listComeSoonAll();

    /**
     * 正在上映的电影查询(状态为1)
     * @return 电影数据列表
     */
    List<MovieListVO> listRelease();


    /**
     * 根据即将上映查询电影(排除掉状态为2)
     * @return 电影数据列表
     */
    List<MovieListVO> listComeSoon(@Param("type") String type, @Param("country") String country, @Param("releaseDate") String releaseDate);

    /**
     * 根据搜索条件查询电影(排除掉状态为2)
     * @return 电影数据列表
     */
    List<MovieListVO> listSearch(@Param("znName") String znName,@Param("type") String type, @Param("country") String country, @Param("releaseDate") String releaseDate);

    /**
     * 根据电影名称模糊查询
     * @param znName
     * @return
     */
    List<MovieListVO> searchMovie(@Param("znName") String znName);


    /**
     * 根据想看人数查询电影信息
     * （排除掉状态为0,排序规制为想看人数越大越靠前)
     * @return 电影数据列表
     */
    List<MovieListVO> listNumberWantToSee();

    /**
     * 查询评分最高的电影（排序规制为评分，分页规制为一次10条数据）
     * @return 电影数据列表
     */
    List<MovieListVO> listScore();

    /**
     * 查询票房最高的电影（排序规制为评分，分页规制为一次10条数据）
     * @return 电影数据列表
     */
    List<MovieListVO> listBoxOffice();

    // 返回JsonPage类型的分页查询所有电影的方法
     JsonPage<MovieListVO> getAllMovieByPage(Integer page, Integer pageSize);


    /**
     * 缓存重建
     */
    public void rebuildCache();


    Long listReleaseDateCount();

    List<MovieListVO> listReleasePage(Long start, Long end);

    JsonPage<MovieListVO> listTop(String znName, Integer page, Integer pageSize);
}
